//#include <stdio.h>
//#include <stdlib.h>
//
//#include <winsock2.h>
//#pragma comment(lib,"ws2_32.lib")
//
///*--------------------------------------------------------------------------*/
//#define MAX_MSG_SIZE 1024
//
//BYTE  bSendBuf[1500];
//BYTE  bRcvBuf[1500];
//struct sockaddr_in gSvrSocketAddr;
//fd_set gsReadFdSet;
//
///*--------------------------------------------------------------------------*/
//void printMsg_WSAGetLastError()
//{
//    LPVOID lpMsgBuf;
//    int nErrorCode;
//
//    nErrorCode = WSAGetLastError();
//    FormatMessage(
//        FORMAT_MESSAGE_ALLOCATE_BUFFER |
//        FORMAT_MESSAGE_FROM_SYSTEM |
//        FORMAT_MESSAGE_IGNORE_INSERTS,
//        NULL,
//        nErrorCode,
//        0, //Language Identifiers 0x0804, // zh-ch:0x0804,en-us:0x0409,
//        (LPTSTR) &lpMsgBuf,
//        0,
//        NULL
//    );
//    printf("WSAGetLastError()=%d, %s\n", nErrorCode, lpMsgBuf);
//    LocalFree( lpMsgBuf );
//}
///*--------------------------------------------------------------------------*/
//int getLocalSocketAddrName(int socketFd)
//{
//    struct sockaddr_in SocketAddr;
//    int nLen;
//    int nRet;
//      
//    memset(&SocketAddr, 0, sizeof(struct sockaddr_in) );
//    nLen = sizeof(struct sockaddr_in);
//    nRet = getsockname ( socketFd, (SOCKADDR *)&SocketAddr, &nLen );
//    if( 0 == nRet )
//    {
//        printf("socketfd=%d local[ip=%d.%d.%d.%d,port=%d]\n", 
//            socketFd,
//            *( (BYTE *)&SocketAddr.sin_addr     ),
//            *( (BYTE *)&SocketAddr.sin_addr + 1 ),
//            *( (BYTE *)&SocketAddr.sin_addr + 2 ),
//            *( (BYTE *)&SocketAddr.sin_addr + 3 ),
//            ntohs(SocketAddr.sin_port)  );
//        return 0;
//    }
//    else
//    {
//        printf("socketfd=%d,getsockname failure: ",socketFd);
//        printMsg_WSAGetLastError();
//        return -1;
//    }
//}
///*--------------------------------------------------------------------------*/
//int getPeerSocketAddrName(int socketFd)
//{
//    struct sockaddr_in SocketAddr;
//    int nLen;
//    int nRet;
//      
//    memset(&SocketAddr, 0, sizeof(struct sockaddr_in) );
//    nLen = sizeof(struct sockaddr_in);
//    nRet = getpeername ( socketFd, (SOCKADDR *)&SocketAddr, &nLen );
//    if( 0 == nRet )
//    {
//        printf("socketfd=%d peer[ip=%d.%d.%d.%d,port=%d]\n", 
//            socketFd,
//            *( (BYTE *)&SocketAddr.sin_addr     ),
//            *( (BYTE *)&SocketAddr.sin_addr + 1 ),
//            *( (BYTE *)&SocketAddr.sin_addr + 2 ),
//            *( (BYTE *)&SocketAddr.sin_addr + 3 ),
//            ntohs(SocketAddr.sin_port)  );
//        return 0;
//    }
//    else
//    {
//        printf("socketfd=%d,getpeername failure: ",socketFd);
//        printMsg_WSAGetLastError();
//        return -1;
//    }   
//}
///*--------------------------------------------------------------------------*/
//int WINAPI threadIoSelect(LPVOID lpParam)
//{
//    fd_set readFdSet;
//    int listenSocketFd;
//    int dataSocketFd;
//    int nBytesRead;
//    int nRetcode;
//    int fd;
//    int i;
//    
//    listenSocketFd = (int)lpParam;
//    while(1)
//    {
//        FD_ZERO(&readFdSet);
//
//        readFdSet = gsReadFdSet;
//
//        printf("select input fdset : ");
//        for(i=0; i<readFdSet.fd_count; i++)
//        {
//            fd = readFdSet.fd_array[i];
//            printf("%d ", fd);
//        }   
//        printf("\n");
//        
//        nRetcode = select(0, &readFdSet, NULL, NULL, NULL);
//        if( 0 == nRetcode)
//        {
//            continue;
//        }
//        if( 0 > nRetcode)
//        {
//            printf("select failure: ");
//            printMsg_WSAGetLastError();
//            break;
//        }
//        
//        printf("select output fdset : ");
//        for(i=0; i<readFdSet.fd_count; i++)
//        {
//            fd = readFdSet.fd_array[i];
//            printf("%d ", fd);
//        }   
//        printf("\n");
//
//        for(i=0; i<readFdSet.fd_count; i++)
//        {
//            fd = readFdSet.fd_array[i];
//            if(fd == listenSocketFd)
//            {
//                //listen socket fd
//                dataSocketFd = accept(listenSocketFd, NULL, NULL);//non-block
//                if( dataSocketFd <= 0 )
//                {
//                    printf("socketfd=%d,accept failure: ", listenSocketFd);
//                    printMsg_WSAGetLastError();
//                    
//                    FD_CLR(listenSocketFd, &gsReadFdSet);                    
//                    continue;
//                }
//                else
//                {
//                    printf("listenSocketFd=%d accept success, new client coming socketfd=%d\n", listenSocketFd, dataSocketFd);
//                    getLocalSocketAddrName(dataSocketFd);
//                    getPeerSocketAddrName(dataSocketFd);
//                    FD_SET(dataSocketFd, &gsReadFdSet);                    
//                }                              
//            }
//            else
//            {
//                //data socket fd
//                memset(bRcvBuf,0,1500);
//                nBytesRead = recv( fd, bRcvBuf, MAX_MSG_SIZE, 0);
//                if( 0 >= nBytesRead )
//                {
//                    printf("socketfd=%d:data socket error,close\n",fd); 
//                    printMsg_WSAGetLastError();
//
//                    FD_CLR(fd, &gsReadFdSet);
//                    closesocket(fd);
//
//                    continue;
//                }
//                else
//                {
//                    getLocalSocketAddrName(fd);
//                    getPeerSocketAddrName(fd);
//                    printf("socketfd=%d, recv msglen=%d, msg=", fd, nBytesRead );
//                    printf("%s\n", bRcvBuf);
//                }                
//            }
//        }
//        
//    }
//    
//    return 0;
//}
///*--------------------------------------------------------------------------*/
//
//int main()
//{
//
//    WORD wVersionRequested;
//    WSADATA wsaData;
//    int nRetCode;
//    int socketfd = -1;
//    int nSendDataFd;
//    int nBytesTx;
//    char c;
//
//    wVersionRequested = 0x0202;
//    nRetCode = WSAStartup(wVersionRequested, &wsaData);
//    if (nRetCode != 0)
//    {
//        printf("WSAStartup failed with error: %d\n", nRetCode);
//        return -1;
//    }
//    else
//    {
//        printf("WSAStartup sucess to startup\n");
//    }
//    if(wsaData.wVersion != wVersionRequested)
//    {
//        printf("requied wVersion=0x%04x,returned wVersion=0x%04x,returned HighestVersion=0x%04x\n",
//                wVersionRequested,
//                wsaData.wVersion,
//                wsaData.wHighVersion );
//        WSACleanup();
//        return -1;
//    }
//
//    socketfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//    if(socketfd < 0)
//    {
//        printf("socket create failure,reason:\n");
//        printMsg_WSAGetLastError();
//
//        WSACleanup();
//        return -1;
//    }
//    else
//    {
//        printf("socket create success,socketfd=%d\n",socketfd);
//    }
//
//    memset(&gSvrSocketAddr, 0, sizeof(struct sockaddr_in) );
//    gSvrSocketAddr.sin_family = AF_INET;
//    gSvrSocketAddr.sin_port = htons(6666);
//    gSvrSocketAddr.sin_addr.s_addr = inet_addr("127.0.0.1");  
//    nRetCode = bind( socketfd, (SOCKADDR *)&gSvrSocketAddr, sizeof(SOCKADDR) );
//    if( 0 != nRetCode)
//    {
//        printf("socket bind failure,reason:\n");
//        printMsg_WSAGetLastError();
//
//        closesocket(socketfd);
//        WSACleanup();
//        return -1;
//    }
//    else
//    {
//        printf("socket bind success\n");
//    }  
//
//    nRetCode = listen(socketfd, SOMAXCONN);
//    if( 0 != nRetCode )
//    {
//        printf("socket listen failure,reason:\n");
//        printMsg_WSAGetLastError();
//
//        closesocket(socketfd);
//        WSACleanup();
//        return -1;
//    }
//    
//    //memset(&gsReadFdSet, 0, sizeof(fd_set));
//    FD_ZERO(&gsReadFdSet);
//    
//    FD_SET(socketfd, &gsReadFdSet);    
//
//    CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
//                         0,
//                         (LPTHREAD_START_ROUTINE) threadIoSelect,
//                         (LPVOID)socketfd,
//                         0, NULL );
//    printf("create thread: threadIoSelect\n");
//
//    Sleep(1000);
//
//    //c = getchar();
//    while(1)
//    {
//        fflush(stdin);
//        c = getchar();
//        
//        printf("please input client(socketfd) you want to send:\n");
//        scanf("%d",&nSendDataFd);
//        
//        printf("please input msg you want to send:\n");
//        memset(bSendBuf, 0, 1500);
//        scanf("%s",bSendBuf);
//
//        nBytesTx = send(nSendDataFd, bSendBuf, strlen(bSendBuf), 0);
//        if(0 >= nBytesTx)
//        {
//            printf("socketfd=%d send failure,reason:\n", nSendDataFd);
//            printMsg_WSAGetLastError();
//        }
//        else
//        {
//            printf("socketfd=%d: send msglen=%d\n", nSendDataFd, nBytesTx);
//        }
//                
//    }
//
//    WSACleanup();
//    
//    return 0;
//}
